#ifndef GRAMMAR_H
#define GRAMMAR_H

#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>

class Grammar
{
public:
    using Symbol = std::string;
    using Production = std::vector<Symbol>;

    // 添加产生式: left -> right
    void addProduction(const Symbol &left, const Production &right);

    // 计算所有非终结符的FIRST集合
    void computeFirst();

    // 查询FIRST集合
    const std::unordered_set<Symbol> &getFirst(const Symbol &symbol) const;

    // 打印所有非终结符的FIRST集合
    void printFirst() const;

    // 设置终结符集合（可选，方便判断）
    void setTerminals(const std::unordered_set<Symbol> &terminals);

    // 判断符号是否终结符
    bool isTerminal(const Symbol &symbol) const;

    // 计算FOLLOW集
    void computeFollow(const Symbol &startSymbol);

    // 打印FOLLOW集
    void printFollow() const;

    // 查询FOLLOW集
    const std::unordered_set<Symbol> &getFollow(const Symbol &symbol) const;

    // 提供访问产生式的接口
    const std::unordered_map<Symbol, std::vector<Production>> &getProductions() const;

private:
    std::unordered_map<Symbol, std::vector<Production>> productions_; // key=非终结符，value=产生式集合
    std::unordered_map<Symbol, std::unordered_set<Symbol>> first_;    // FIRST集
    std::unordered_set<Symbol> terminals_;

    std::unordered_map<Symbol, std::unordered_set<Symbol>> follow_;

    bool computeFirstForSymbol(const Symbol &symbol, std::unordered_set<Symbol> &visited);
};

#endif
